home *** CD-ROM | disk | FTP | other *** search
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/time.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <stdio.h>
-
- #define SOCKETNUMBER 2019
-
- #define IN_HANDLER 0x0010
- #define OUT_HANDLER 0x0020
- #define BOTH_HANDLER (IN_HANDLER | OUT_HANDLER)
-
- extern int errno;
- #include <errno.h>
-
- #ifdef NDEBUG
- #define DebugMessage()
- #else
- static int debugging = 0;
- static void DebugMessage(format, args)
- char *format;
- int args;
- {
- if (debugging) {
- _doprnt(format, &args, stdout);
- fflush(stdout);
- }
- }
- #endif
-
- #ifdef CHECKOUTSOCKETS
- void checkOutSocket(socket)
- int socket;
- {
- int owner, flags;
- owner = fcntl(socket, F_GETOWN, 0);
- DebugMessage("the socket %d owner is %d\n", socket, owner);
- flags = fcntl(socket, F_GETFL, 0);
- DebugMessage("flags:");
- if (flags & FASYNC) DebugMessage("FASYNC ");
- if (flags & FNDELAY) DebugMessage("FNDELAY ");
- if (flags & FAPPEND) DebugMessage("FAPPEND ");
- DebugMessage("\n");
- }
- #endif
-
- typedef int (*PFI)();
- static PFI inHandlers[32], outHandlers[32];
- static int inMask, outMask;
- static int nfds = 0;
-
- void panic(S)
- char *S;
- {
- perror(S);
- exit(1);
- }
- static struct timeval zero = {0, 0};
- static int requestSocket;
-
- int sigIOHandler()
- {
- int nfound, infds, outfds, nextfd;
- #ifdef ASYCHRONOUS
- DebugMessage("Got a sig IO\n");
- #else
- /* DebugMessage("Waiting for a message\n"); */
- #endif
- #ifdef CHECKOUTSOCKETS
- checkOutSocket(requestSocket);
- #endif
- infds = inMask;
- outfds = outMask;
- #ifdef ASYNCHRONOUS
- nfound = select(nfds, &infds, &outfds, 0, &zero);
- #else
- nfound = select(nfds, &infds, &outfds, 0, 0);
- #endif
- if (nfound == 0) DebugMessage(
- "sigIOHandler: select %d in = 0x%08x out = 0x%08x\n",
- nfound, infds, outfds);
- if (nfound < 0) panic("sigIOHandler: (accept)");
- if (nfound > 0) {
- while ((nextfd = myffs(infds)) < 32) {
- infds &= ~ (1 << nextfd);
- (*inHandlers[nextfd])(nextfd, IN_HANDLER);
- }
- while ((nextfd = myffs(outfds)) < 32) {
- outfds &= ~ (1 << nextfd);
- (*outHandlers[nextfd])(nextfd, OUT_HANDLER);
-
- }
- }
- }
-
- void tearDown(socket)
- int socket;
- {
- int i;
- inMask &= ~ (1 << socket);
- outMask &= ~ (1 << socket);
- if (socket == nfds - 1) {
- nfds = 0;
- i = myffs(inMask);
- if (i < 32) nfds = i + 1;
- i = myffs(outMask);
- if (i < 32 && i > nfds - 1) nfds = i + 1;
- }
- inHandlers[socket] = NULL;
- outHandlers[socket] = NULL;
- close(socket);
- }
-
- int myffs(x)
- int x;
- {
- register int r;
- r = ffs(x);
- return r == 0 ? 32 : r - 1;
- }
-
- void establishHandler(socket, handler, inout)
- int socket, inout;
- int (*handler)();
- {
- if (socket >= nfds) nfds = socket + 1;
- if (inout & IN_HANDLER) {
- inHandlers[socket] = handler;
- inMask |= (1 << socket);
- }
- if (inout & OUT_HANDLER) {
- outHandlers[socket] = handler;
- outMask |= (1 << socket);
- }
- }
-
- static int requestHandler(socket, inout)
- int socket, inout;
- {
- char requestBuffer[128], operationName[128], opCode;
- int theOID;
-
- receive(socket, requestBuffer);
- if (*requestBuffer == '\0') {
- DebugMessage("End of file -- checkpointing\n");
- ON_finalize();
- tearDown(socket);
- } else {
- DebugMessage("Request: %s", requestBuffer);
- if (sscanf(requestBuffer, "%c", &opCode) != 1) {
- panic("requestHandler: (sscanf - bogus message)");
- }
- switch (opCode) {
- case 'T':
- if (sscanf(requestBuffer, "%*c %s\n", operationName) != 1) {
- panic("requestHandler: (sscanf - bogus message)");
- }
- theOID = ON_Translate(operationName);
- sprintf(requestBuffer, "T 0x%08x\n", theOID);
- break;
- case 'A':
- theOID = AllocateOIDS();
- sprintf(requestBuffer, "A 0x%08x\n", theOID);
- break;
- case 'N':
- if (sscanf(requestBuffer, "%*c 0x%x\n", &theOID) != 1) {
- panic("requestHandler: (sscanf - bogus message)");
- }
- sprintf(requestBuffer, "N %s\n", ON_Name(theOID));
- break;
- default:
- panic("requestHandler: (switch)");
- break;
- }
- DebugMessage("Result : %s", requestBuffer);
- send(socket, requestBuffer);
- }
- }
-
- int acceptRequestHandler(socket, inout)
- int socket, inout;
- {
- int newfd;
- struct sockaddr_in addr;
- int addr_length = sizeof(addr);
- DebugMessage("Got an accept request inout = 0x%08x\n", inout);
- newfd = accept(requestSocket, &addr, &addr_length);
- if (newfd < 0) {
- if (errno == EWOULDBLOCK) {
- DebugMessage("Would block from acceptrequestHandler.accept\n");
- } else panic("acceptRequestHandler: (accept)");
- } else {
- DebugMessage("acceptRequestHandler accept new socket = %d\n", newfd);
- #ifdef CHECKOUTSOCKET
- checkOutSocket(newfd);
- #endif
- if (fcntl(newfd, F_SETFL, FASYNC | FNDELAY) < 0) {
- panic("new socket: (first fcntl)");
- }
- if (fcntl(newfd, F_SETOWN, -getpid()) < 0) {
- panic("new socket: (second fcntl)");
- }
- establishHandler(newfd, requestHandler, IN_HANDLER);
- }
- }
-
- void establishSocket()
- {
- struct sockaddr_in requestSocketAddress;
- char myHostName[100];
- struct hostent *myHost;
-
- bzero(&requestSocketAddress, sizeof(requestSocketAddress));
- requestSocket = socket(AF_INET, SOCK_STREAM, 0, 0);
- if (requestSocket < 0) panic("establishSocket: (socket)");
-
- requestSocketAddress.sin_family = AF_INET;
- if (gethostname(myHostName, 100) < 0) {
- panic("establishConnection: gethostname");
- }
- myHost = gethostbyname(myHostName);
- if (myHost == NULL) {
- panic("establishConnection: gethostbyname");
- }
- bcopy(myHost->h_addr, &requestSocketAddress.sin_addr, myHost->h_length);
- requestSocketAddress.sin_port = htons(((short int)SOCKETNUMBER));
- if (bind(requestSocket, &requestSocketAddress, sizeof(requestSocketAddress), 0) < 0) {
- panic("establishSocket: (bind)");
- }
-
- #ifdef ASYNCHRONOUS
- if (fcntl(requestSocket, F_SETFL, FASYNC | FNDELAY) < 0) {
- panic("establishSocket: (first fcntl)");
- }
- #endif
- DebugMessage("My pid %d\n", getpid());
- #ifdef CHECKOUTSOCKET
- checkOutSocket(requestSocket);
- #endif
- #ifdef ASYNCHRONOUS
- if (fcntl(requestSocket, F_SETOWN, -getpid()) < 0) {
- panic("establishSocket: (second fcntl)");
- }
- #endif
- establishHandler(requestSocket, acceptRequestHandler, IN_HANDLER);
- listen(requestSocket, 5);
- }
-
- main(argc, argv)
- int argc;
- char **argv;
- {
- struct sigvec sv;
- int i;
- sv.sv_mask = 0;
- sv.sv_onstack = 0;
- #ifdef ASYNCHRONOUS
- sv.sv_handler = sigIOHandler;
- sigvec(SIGIO, &sv, NULL);
- #endif
- sv.sv_handler = SIG_IGN;
- sigvec(SIGPIPE, &sv, NULL);
-
- ON_initialize();
- establishSocket();
- while(1) {
- #ifdef ASYNCHRONOUS
- sigpause(0);
- #else
- sigIOHandler();
- #endif
- }
- }
-